home *** CD-ROM | disk | FTP | other *** search
/ Monster Media 1996 #15 / Monster Media Number 15 (Monster Media)(July 1996).ISO / graphics / 3dview12.zip / 3DVIEWER.CPP < prev    next >
C/C++ Source or Header  |  1996-05-30  |  13KB  |  381 lines

  1. #include <stdio.h>
  2. #include <bios.h>
  3. #include <time.h>
  4. #include <math.h>
  5. #include <stdlib.h>
  6. #include <i86.h>
  7. #include <string.h>
  8.  
  9. #include "defines.hpp"
  10.  
  11. #include "vesa.hpp"
  12. #include "3d.hpp"
  13. #include "vesa3d.hpp"
  14. #include "misc.hpp"
  15. #include "mouse.hpp"
  16.  
  17. void ShowTitle() {
  18.     printf( "# 3D-BMP-Viewer V1.2   (w) by P.Kayser 1996 \n" );
  19.     printf( "# EMAIL : p.kayser@tu-bs.de | COMPUSERVE: 100517,3516\n" );
  20. };
  21.  
  22. void ShowUsage() {
  23.     printf( "# usage : 3dview (-abdlmwz) <file(.bmp)> (<mode>)\n" );
  24.     printf( "# \n" );
  25.     printf( "# options\n" );
  26.     printf( "#   -a        : show additional informations.\n" );
  27.     printf( "#   -b        : disable bitmap.\n" );
  28.     printf( "#   -d<dist>  : distance. <dist> from 0.01 (far) to 3 (near).\n" );
  29.     printf( "#   -l        : list available 256-color-modes.\n" );
  30.     printf( "#   -m        : enable mouse-control.\n" );
  31.     printf( "#   -w        : if screen flickers, try this.\n" );
  32.     printf( "#   -z        : enable z-buffer.\n" );
  33. };
  34.  
  35. void ShowAddInfo() {
  36.     printf( "# \n" );
  37.     printf( "# Needs VBE version 2.0. If your graphic card has an older VBE version,\n" );
  38.     printf( "# get shareware UniVBE 5.1a or newer from www.scitechsoft.com!\n" );
  39.     printf( "# Only 256-color-modes allowed.\n" );
  40.     printf( "# Some modes may not work even when the mode is listed using the\n");
  41.     printf( "# '-l'-option. Because this program uses double-buffered animation,\n" );
  42.     printf( "# you will for example need 2 MB on your graphic card for 1024x768.\n" );
  43.     printf( "# The bitmap must be '256-color-WINDOWS-RGB-encoded' and should have\n" );
  44.     printf( "# a maximum of 192 colors. Use a program like shareware Paintshop\n" );
  45.     printf( "# Pro to convert to .BMP and decrease color depth to 192.\n" );
  46. };
  47.  
  48. void main( int argc, char *argv[] ) {
  49.  
  50.     Boolean ListModes = False;
  51.     Boolean ShowBitmap = True;
  52.     Boolean ShowAddInfos = False;
  53.     Boolean WithZBuffer = False;
  54.     Boolean MouseControl = False;
  55.     Boolean WaitVRetrace = False;
  56.     double MinZoom = 0.01;
  57.     double MaxZoom = 3;
  58.     double NormZoom = 1.5;
  59.     double Distance = NormZoom;
  60.     int CmdCount = 1;
  61.     char Buffer [15];
  62.  
  63.     VESA_SetTextMode();
  64.     ShowTitle();
  65.  
  66.     if ( VESA_Boot() != 0 ) {
  67.         return;
  68.     };
  69.  
  70.     if ( argc == CmdCount ) {
  71.         ShowUsage();
  72.         return;
  73.     };
  74.  
  75.     while ( (argv[CmdCount])[0] == '-' ) {
  76.         int OptCount = 1;
  77.         while ( OptCount < strlen( argv[CmdCount] ) ) {
  78.             switch ( (argv[CmdCount])[OptCount] ) {
  79.                 case 'a' :
  80.                     ShowAddInfos = True;
  81.                     break;
  82.                 case 'b' :
  83.                     ShowBitmap = False;
  84.                     break;
  85.                 case 'd' :
  86.                     Distance = strtod( strncpy( Buffer,
  87.                                                 &(argv[CmdCount])[OptCount+1],
  88.                                                 strlen( argv[CmdCount] ) - OptCount ),
  89.                                        NULL );
  90.                     if ( Distance < MinZoom || Distance > MaxZoom )
  91.                         Distance = NormZoom;
  92.                     OptCount = strlen ( argv[CmdCount] );                                       
  93.                     break;
  94.                 case 'l' :
  95.                     ListModes = True;
  96.                     break;
  97.                 case 'm' :
  98.                     MouseControl = True;
  99.                     break;
  100.                 case 'w' :
  101.                     WaitVRetrace = True;
  102.                     break;
  103.                 case 'z' :
  104.                     WithZBuffer = True;
  105.                     break;
  106.                 default:
  107.                     printf( "\n" );
  108.                     printf( "ERROR : '%c' is an unknown option !\n" , argv[CmdCount][OptCount] );
  109.                     return;
  110.             }
  111.             OptCount++;
  112.         };
  113.         CmdCount++;
  114.     };
  115.  
  116.     if ( ShowAddInfos == True ) {
  117.         ShowUsage();
  118.         ShowAddInfo();
  119.         return;       
  120.     };
  121.  
  122.     if ( ListModes == True ) {
  123.         printf( "\n" );
  124.         VESA_PrintModeList8B();
  125.         return;
  126.     };
  127.  
  128.     static VESA3D_Texture TEX;
  129.     char* Filename = new char [256];
  130.     strcpy( Filename, argv[CmdCount] );
  131.  
  132.     if ( VESA3D_LoadTexture( Filename, TEX ) != 0 )
  133.         if ( VESA3D_LoadTexture( strcat( Filename, ".BMP" ), TEX ) != 0 ) {
  134.             printf( "\n" );
  135.             printf( "ERROR : Could not open .BMP-File !\n" );
  136.             return;
  137.     };
  138.  
  139.     VESA3D_ConvertTexture( TEX );
  140.  
  141.     CmdCount++;
  142.  
  143.     WORD Mode;
  144.     
  145.     if ( argc == CmdCount ) {
  146.         Mode = 0x0101;
  147.     }
  148.     else {
  149.         Mode = WORD( strtoul( argv[CmdCount], NULL, 16 ) );
  150.     };
  151.  
  152.     if ( VESA_InitMode( Mode ) != 0 ) {
  153.         return;
  154.     };
  155.  
  156.     if ( VESA_BpP != 8 ) {
  157.         printf( "\n" );
  158.         printf( "ERROR: Not a 256-Color-Mode !\n" );
  159.         return;
  160.     };
  161.  
  162.     VESA3D_Init();
  163.     if ( WithZBuffer == True )
  164.         VESA3D_MakeZBuffer();
  165.  
  166.     for ( int i = 46; i >= 0; i-- )
  167.         VESA_SetColor8B( WORD(239-i) ,
  168.                          WORD(64+i*3),
  169.                          WORD(64+i*3),
  170.                          WORD(64+i*3) );
  171.  
  172.     for ( i = 15; i >= 0; i-- )
  173.         VESA_SetColor8B( WORD(255-i),
  174.                          WORD(128+i*8),
  175.                          WORD(128+i*8),
  176.                          WORD(128+i*8) );
  177.  
  178.     VESA_SetColor8B( 0, 0, 0, 0 );
  179.  
  180.     if ( ShowBitmap == True )
  181.         VESA3D_SetTexturePalette( TEX, 192 );
  182.  
  183.     double px, py;
  184.  
  185.     if ( TEX.TDY > TEX.TDX ) {
  186.         px = 1;
  187.         py = double(TEX.TDY) / TEX.TDX;
  188.     }
  189.     else {
  190.         py = 1;
  191.         px = double(TEX.TDX) / TEX.TDY;
  192.     };
  193.  
  194.     long p1 = _3D_NewPoint(  0, py, 0 );
  195.     long p2 = _3D_NewPoint( px, py, 0 );
  196.     long p3 = _3D_NewPoint( px,  0, 0 );
  197.     long p4 = _3D_NewPoint(  0,  0, 0 );
  198.  
  199.     double dx = 0.25, dz = 0.05;
  200.  
  201.     long p5  = _3D_NewPoint( -dx, -dx, dz );
  202.     long p6  = _3D_NewPoint( -dx, -dx, -dz );
  203.     long p7  = _3D_NewPoint( px+dx, -dx, dz );
  204.     long p8  = _3D_NewPoint( px+dx, -dx, -dz );
  205.     long p9  = _3D_NewPoint( -dx, py+dx, dz );
  206.     long p10 = _3D_NewPoint( -dx, py+dx, -dz );
  207.     long p11 = _3D_NewPoint( px+dx, py+dx, dz );
  208.     long p12 = _3D_NewPoint( px+dx, py+dx, -dz );
  209.  
  210.     long p13 = _3D_NewPoint( 0, 0, dz );
  211.     long p14 = _3D_NewPoint( 0, 0, -dz );
  212.     long p15 = _3D_NewPoint( px, 0, dz );
  213.     long p16 = _3D_NewPoint( px, 0, -dz );
  214.     long p17 = _3D_NewPoint( 0, py, dz );
  215.     long p18 = _3D_NewPoint( 0, py, -dz );
  216.     long p19 = _3D_NewPoint( px, py, dz );
  217.     long p20 = _3D_NewPoint( px, py, -dz );
  218.  
  219.     double ds = 0.2;
  220.  
  221.     long p21 = _3D_NewPoint( px/2-ds, py/2+ds, ds );
  222.     long p22 = _3D_NewPoint( px/2+ds, py/2+ds, ds );
  223.     long p23 = _3D_NewPoint( px/2+ds, py/2+ds, -ds );
  224.     long p24 = _3D_NewPoint( px/2-ds, py/2+ds, -ds );
  225.     long p25 = _3D_NewPoint( px/2-ds, py/2-ds, ds );
  226.     long p26 = _3D_NewPoint( px/2+ds, py/2-ds, ds );
  227.     long p27 = _3D_NewPoint( px/2+ds, py/2-ds, -ds );
  228.     long p28 = _3D_NewPoint( px/2-ds, py/2-ds, -ds );
  229.  
  230.     DWORD PalStart = 193;
  231.  
  232.     _3D_Triangle_SideTyp S = Singlesided;
  233.     _3D_Triangle_Typ T;
  234.     long G = 0;
  235.     if ( WithZBuffer == True )
  236.         T = GouraudShadedZBuf;
  237.     else
  238.         T = GouraudShaded;
  239.  
  240.     if ( ShowBitmap == True )
  241.         if ( WithZBuffer == True )
  242.             VESA3D_New3DTexQuad (  p1,  p2,  p3,  p4, TEX, Doublesided, TexturedZBuf );
  243.         else
  244.             VESA3D_New3DTexQuad (  p1,  p2,  p3,  p4, TEX, Doublesided, Textured );
  245.  
  246.     VESA3D_New3DQuadx(  p5,  p7,  p8,  p6, PalStart, S, T, G ); 
  247.     VESA3D_New3DQuadx(  p9,  p5,  p6, p10, PalStart, S, T, G ); 
  248.     VESA3D_New3DQuadx( p11,  p9, p10, p12, PalStart, S, T, G );
  249.     VESA3D_New3DQuadx(  p7, p11, p12,  p8, PalStart, S, T, G );
  250.     VESA3D_New3DQuadx(  p9, p17, p13,  p5, PalStart, S, T, G );
  251.     VESA3D_New3DQuadx(  p6, p14, p18, p10, PalStart, S, T, G );
  252.     VESA3D_New3DQuadx(  p9, p11, p19, p17, PalStart, S, T, G );
  253.     VESA3D_New3DQuadx( p18, p20, p12, p10, PalStart, S, T, G );
  254.     VESA3D_New3DQuadx( p19, p11,  p7, p15, PalStart, S, T, G );
  255.     VESA3D_New3DQuadx( p16,  p8, p12, p20, PalStart, S, T, G );
  256.     VESA3D_New3DQuadx( p13, p15,  p7,  p5, PalStart, S, T, G );
  257.     VESA3D_New3DQuadx(  p6,  p8, p16, p14, PalStart, S, T, G );
  258.     VESA3D_New3DQuadx( p17, p19,  p2,  p1, PalStart, S, T, G );
  259.     VESA3D_New3DQuadx( p13, p17,  p1,  p4, PalStart, S, T, G );
  260.     VESA3D_New3DQuadx( p19, p15,  p3,  p2, PalStart, S, T, G );
  261.     VESA3D_New3DQuadx( p15, p13,  p4,  p3, PalStart, S, T, G );
  262.     VESA3D_New3DQuadx(  p1,  p2, p20, p18, PalStart, S, T, G );
  263.     VESA3D_New3DQuadx(  p2,  p3, p16, p20, PalStart, S, T, G );
  264.     VESA3D_New3DQuadx(  p3,  p4, p14, p16, PalStart, S, T, G );
  265.     VESA3D_New3DQuadx(  p4,  p1, p18, p14, PalStart, S, T, G );
  266.  
  267.     if ( WithZBuffer == True ) {
  268.         VESA3D_New3DQuad( p24, p23, p22, p21, PalStart, Singlesided, GouraudShadedZBuf );
  269.         VESA3D_New3DQuad( p21, p22, p26, p25, PalStart, Singlesided, GouraudShadedZBuf );
  270.         VESA3D_New3DQuad( p22, p23, p27, p26, PalStart, Singlesided, GouraudShadedZBuf );
  271.         VESA3D_New3DQuad( p23, p24, p28, p27, PalStart, Singlesided, GouraudShadedZBuf );
  272.         VESA3D_New3DQuad( p24, p21, p25, p28, PalStart, Singlesided, GouraudShadedZBuf );
  273.         VESA3D_New3DQuad( p25, p26, p27, p28, PalStart, Singlesided, GouraudShadedZBuf );
  274.     };
  275.     
  276.     double MaxDist = sqrt( (px/2+dx)*(px/2+dx) + (py/2+dx)*(py/2+dx) + dz*dz );
  277.     double Rad;
  278.  
  279.     if ( px > py ) {
  280.         Rad = 3 * px;
  281.     }
  282.     else {
  283.         Rad = 3 * py ;
  284.     };
  285.  
  286.     int N = 0;
  287.     VESA3D_ShadeSub = Rad - MaxDist;
  288.     VESA3D_ShadeMul = 46 / ( 2 * MaxDist );
  289.     
  290.     long *StarsX = new long [300];
  291.     long *StarsY = new long [300];
  292.     char *StarsC = new char [300];
  293.  
  294.     _3D_SetAlpha( 1.57 );
  295.     _3D_SetPhi( 0 );
  296.     _3D_SetGamma( 0 );
  297.     _3D_SetOmega( 0 );
  298.     _3D_SetEye( 0, 0, 0 );
  299.  
  300.     for ( i = 0; i < 300; i++ ) {
  301.         StarsX[i] = MISC_Random(VESA_MaxX);
  302.         StarsY[i] = MISC_Random(VESA_MaxY);
  303.         StarsC[i] = char( 240+MISC_Random(15) );
  304.     };
  305.  
  306.     double A = 0, B = 1.57, C = 0, D = 0;
  307.  
  308.     _3D_ScreenDistance = Distance;
  309.  
  310.     _3D_Matrix SpecMatrix;
  311.     _3D_InitMatrix_Rotate( SpecMatrix, sin(0.1), cos(0.1), sin(0.1), cos(0.1),
  312.                            0, 1 ); 
  313.  
  314.     MOUSE_SMouseMoves Move;
  315.     MOUSE_SMouseButtons Buttons;
  316.  
  317.     clock_t Start = clock();
  318.  
  319.     while( _bios_keybrd( _KEYBRD_READY )==0 ) {
  320.         N++;
  321.         if ( WithZBuffer == True )
  322.             _3D_RotatePointsForward( p21, p28, px/2, py/2, 0, SpecMatrix );
  323.         if ( MouseControl == True ) {
  324.             MOUSE_GetMouseMoves( Move );
  325.             MOUSE_GetButtonState( Buttons );
  326.             A += double(Move.MoveDX) / 100;
  327.             B += double(Move.MoveDY) / 100;
  328.             if ( Buttons.RightButton == True ) {
  329.                 _3D_ScreenDistance -= 0.1;
  330.                 if ( _3D_ScreenDistance < MinZoom )
  331.                     _3D_ScreenDistance = MinZoom;
  332.             };
  333.             if ( Buttons.LeftButton == True ) {
  334.                 _3D_ScreenDistance += 0.1;
  335.                 if ( _3D_ScreenDistance > MaxZoom )
  336.                     _3D_ScreenDistance = MaxZoom;
  337.             };
  338.         } 
  339.         else { 
  340.             D += 0.1; 
  341.             A += 0.02 + 0.02 * sin( A + D );
  342.             B += 0.04 + 0.04 * sin( B + D );
  343.             C += 0.06 + 0.06 * sin( C + D );
  344.         };
  345.         _3D_SetPhi( A );
  346.         _3D_SetGamma( B );
  347.         _3D_SetOmega( C );
  348.         _3D_SetEye_Globe( px/2, py/2, 0, Rad );
  349.         _3D_InitRotation();
  350.         _3D_ProjectPoints();
  351.         _3D_PrepareObjects();
  352.         if ( WithZBuffer == True ) {
  353.             VESA3D_ClearZBuffer();
  354.             //_3D_SortObjectsZ();
  355.         }
  356.         else
  357.             _3D_SortObjects();
  358.         VESA3D_FlipPageWrite();
  359.         VESA_ClearScreen8B( 0, VESA3D_WriteSelector );
  360.         for ( i = 0; i < 300; i++ ) {
  361.             VESA_Pix8BC( StarsX[i], StarsY[i], StarsC[i], VESA3D_WriteSelector );
  362.         };
  363.         _3D_DrawObjects();
  364.         VESA3D_FlipPageShow();
  365.         if ( WaitVRetrace == True )
  366.             VESA_SyncDisplay();
  367.     };
  368.  
  369.     clock_t End = clock();
  370.            
  371.     _bios_keybrd( _KEYBRD_READ );
  372.  
  373.     VESA_SetTextMode();
  374.     ShowTitle();
  375.     printf( "\n" );
  376.     printf( "%f Frames per second.\n", double( N ) / ( End-Start ) * CLOCKS_PER_SEC );
  377.  
  378.     VESA_Exit(); 
  379. };
  380.  
  381.